/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



import java.io.IOException;

/**
 *
 * @author ntomio
 */
public class Pere extends Thread{

    /**
     * @param args the command line arguments
     */
    
    private Process process;
    private Tampon tamponDEmission;
    private Tampon tamponDeTrace;
    private Tampon tamponDeReception;
    private HorlogeLamport horloge;
   
    
    public Pere (Process _process)
    {
        this.process = _process;
        this.tamponDEmission = this.process.getTamponDEmission();
        this.tamponDeTrace = this.process.getTamponDeTrace();
        this.tamponDeReception = this.process.getTamponDeReception();
        this.horloge = this.process.getHorloge();
    }
    
   @Override
   public void run()
   {
       System.out.println("Lancement du pere du process " + this.process.getNumProcess());
       
       while(true)
       {
          while(tamponDeReception.getTampon().size() > 0)
           {
              System.out.println("Process " +process.getNumProcess()+", taille du tampon de reception :"+tamponDeReception.getTampon().size());
               System.out.println("Process "+process.getNumProcess()+" Je receptionne un message");
               receptionMessage();
           }

           int numAleatoire;
           numAleatoire = (int)(int) (Math.random() * 30);;

           /*if (numAleatoire >= 0 && numAleatoire < 1)
           {
               horloge.incrementeHorloge();
               //System.out.println("Je fais une action locale");
           }
           else if (numAleatoire >= 1 && numAleatoire < 28)
           {
               //System.out.println("Id process : " + process.getNumProcess());
               System.out.println(process.getNumProcess()+" : J'envoie un message");
               MessageUtile messageUtile = new MessageUtile("REP", 1, 1);
               envoiMessage(messageUtile);
               //System.out.println("Taille tampon après ajout : " + tamponDeReception.getTampon().size());
           }
           else
           {
               //cloture SVG;
               System.out.println("Je ferme");
           }*/
       }
   }
   
   /*
    * Fonction envoi message
    */
   
   public void envoiMessage(MessageUtile message)
   {
       //Ajout du message dans le tampon d'émission
       tamponDEmission.setElementTampon(message);
       System.out.println("Process "+process.getNumProcess()+" Tampon emission  : " + tamponDEmission.getTampon().size());
       //Incrément de  l'horloge
       horloge.incrementeHorloge(); 
   }
   
   /*
    * Fonction reception message
    */
   
   public void receptionMessage ()
   {
       //Récupération message dans le tampon de reception
       MessageUtile message = (MessageUtile) tamponDeReception.getElementTampon();
       //Incrément de l'horloge
       horloge.incrementeHorloge(message.getEstampille());
       //Envoi du message reçu dans le tampon de trace
       System.out.println("Process "+process.getNumProcess()+" Message receptionne");
       envoiTrace (message);       
       System.out.println("Process " +process.getNumProcess()+", taille du tampon de reception :"+tamponDeReception.getTampon().size());
   }
   
   /*
    * Fonction envoi trace
    */
   
   public void envoiTrace(MessageUtile message)
   {
       System.out.println("Process "+process.getNumProcess()+" Envoi du message à la trace");
       //Création de l'ordre à transmettre au tampon de trace
       MessageOrdre ordre = new MessageOrdre(message.getContenu(), message.getIdProcess(), this.process.getNumProcess(), message.getEstampille(), this.horloge.getCompteur());
       
       //Ajout du message d'envoi ou de réception dans le tampn de trace
       tamponDeTrace.setElementTampon(ordre);
   }       
}       
  

